WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®å æ¬çã¬ã€ãããã®ä»çµã¿ãå©ç¹ãå®è£ ããããŠã°ããŒãã«ãã©ãããã©ãŒã ã§ç¡æ°ã®è€è£œãªããžã§ã¯ããæ¯é¡ã®ãªãããã©ãŒãã³ã¹ã§ã¬ã³ããªã³ã°ããããã®é«åºŠãªãã¯ããã¯ãæ¢ããŸãã
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ïŒã°ããŒãã«ãªäœéšã®ããã®å¹ççãªè€è£œãªããžã§ã¯ãã¬ã³ããªã³ã°ãè§£ãæŸã€
çŸä»£ã®Webéçºã®åºå€§ãªé åã«ãããŠãé åçã§é«æ§èœãª3Däœéšãåµåºããããšã¯æãéèŠã§ããæ²¡å ¥åã®ã²ãŒã ãè€éãªããŒã¿å¯èŠåããã詳现ãªå»ºç¯ãŠã©ãŒã¯ã¹ã«ãŒãã€ã³ã¿ã©ã¯ãã£ããªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒãŸã§ããªãããªãªã¢ã«ã¿ã€ã ã°ã©ãã£ãã¯ã¹ãžã®éèŠã¯é«ãŸãç¶ããŠããŸãããããã®ã¢ããªã±ãŒã·ã§ã³ã§å ±éã®èª²é¡ãšãªãã®ããæ°å€ãã®åäžãŸãã¯éåžžã«ãã䌌ããªããžã§ã¯ããã¬ã³ããªã³ã°ããããšã§ããæ°åæ¬ã®æšã ãããæ£®ãç¡æ°ã®ãã«ãç«ã¡äžŠã¶éœåžããããã¯äœçŸäžãã®åã ã®èŠçŽ ãããªãããŒãã£ã¯ã«ã·ã¹ãã ãèããŠã¿ãŠãã ãããåŸæ¥ã®ã¬ã³ããªã³ã°ã¢ãããŒãã¯ããã®ãããªè² è·ã®äžã§ã¯ãã°ãã°æ©èœäžå šã«é¥ãããã¬ãŒã ã¬ãŒãã®äœäžããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®æé©åäžè¶³ã«ã€ãªãããŸããããã¯ç¹ã«ã倿§ãªããŒããŠã§ã¢èœåãæã€ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠã¯å€§ããªåé¡ã§ãã
ããã§ã驿°çãªãã¯ããã¯ãšããŠWebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ãç»å ŽããŸããã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãGPUäž»å°ã®åŒ·åãªæé©åã§ãããéçºè ããã£ãäžåºŠã®æç»ã³ãŒã«ã§åããžãªã¡ããªããŒã¿ã®å€æ°ã®ã³ããŒãã¬ã³ããªã³ã°ã§ããããã«ãããã®ã§ããCPUãšGPUéã®éä¿¡ãªãŒããŒããããåçã«åæžããããšã§ãã€ã³ã¹ã¿ã³ã·ã³ã°ã¯åäŸã®ãªãããã©ãŒãã³ã¹ãè§£æŸãããã€ãšã³ãã®ã¯ãŒã¯ã¹ããŒã·ã§ã³ããããæ§ãããªã¢ãã€ã«ããã€ã¹ãŸã§ãåºç¯ãªããã€ã¹ã§ã¹ã ãŒãºã«åäœãããåºå€§ã§è©³çްããã€éåžžã«ãã€ãããã¯ãªã·ãŒã³ã®äœæãå¯èœã«ããŸããããã«ãããäžçäžã®ãŠãŒã¶ãŒã«äžè²«ããé åçãªäœéšãä¿èšŒããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãWebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®äžçãæ·±ãæãäžããŠãããŸããããã解決ããæ ¹æ¬çãªåé¡ã調æ»ãããã®äžå¿çãªä»çµã¿ãçè§£ããå®è·µçãªå®è£ æé ã远ããé«åºŠãªãã¯ããã¯ã«ã€ããŠè°è«ãããããŠæ§ã ãªæ¥çã«ããããã®å€å€§ãªå©ç¹ãšå€æ§ãªå¿çšäŸãæããã«ããŸããããªããçç·Žããã°ã©ãã£ãã¯ã¹ããã°ã©ããŒã§ãããWebGLã®åå¿è ã§ããããã®èšäºã¯ã€ã³ã¹ã¿ã³ã·ã³ã°ã®åãæŽ»çšããWebããŒã¹ã®3Dã¢ããªã±ãŒã·ã§ã³ãæ°ããªå¹çãšèŠèŠçå¿ å®åºŠã®é«ã¿ãžãšåŒãäžããããã®ç¥èãæäŸããŸãã
ã¬ã³ããªã³ã°ã®ããã«ããã¯ïŒãªãã€ã³ã¹ã¿ã³ã·ã³ã°ãéèŠãªã®ã
ãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®åãçã«çè§£ããããã«ã¯ãåŸæ¥ã®3Dã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«å åšããããã«ããã¯ãçè§£ããããšãäžå¯æ¬ ã§ããè€æ°ã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ãããå Žåãããšããããããžãªã¡ããªçã«åäžã§ãã£ãŠããåŸæ¥ã®ã¢ãããŒãã§ã¯ãªããžã§ã¯ãããšã«åå¥ã®ãæç»ã³ãŒã«ããè¡ãããšããããããŸããæç»ã³ãŒã«ãšã¯ãCPUããGPUãžããªããã£ãïŒäžè§åœ¢ãç·ãç¹ïŒã®ããããæç»ããããæç€ºããåœä»€ã§ãã
以äžã®èª²é¡ãèããŠã¿ãŠãã ããïŒ
- CPU-GPUéã®éä¿¡ãªãŒããŒãããïŒ åæç»ã³ãŒã«ã«ã¯äžå®éã®ãªãŒããŒããããçºçããŸããCPUã¯ããŒã¿ãæºåããã¬ã³ããªã³ã°ã¹ããŒãïŒã·ã§ãŒããŒããã¯ã¹ãã£ããããã¡ã®ãã€ã³ãã£ã³ã°ïŒãèšå®ãããããŠGPUã«ã³ãã³ããçºè¡ããªããã°ãªããŸãããæ°åãã®ãªããžã§ã¯ãã«å¯ŸããŠããã®CPUãšGPUéã®çµ¶ãéãªãããåãã¯ããã«CPUã飜åãããGPUãæ¬æ°ãåºããã£ãšåã«äž»èŠãªããã«ããã¯ãšãªã£ãŠããŸããŸããããã¯ãã°ãã°ãCPUããŠã³ããã§ãããšèšãããŸãã
- ã¹ããŒãã®å€æŽïŒ æç»ã³ãŒã«éã§ç°ãªããããªã¢ã«ããã¯ã¹ãã£ããŸãã¯ã·ã§ãŒããŒãå¿ èŠãªå ŽåãGPUã¯ãã®å éšã¹ããŒããåèšå®ããå¿ èŠããããŸãããããã®ã¹ããŒã倿Žã¯ç¬æã«è¡ãããããã§ã¯ãªãããããªãé å»¶ãåŒãèµ·ãããå šäœçãªã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸãã
- ã¡ã¢ãªã®éè€ïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ãªãã§ã¯ã1000æ¬ã®åäžã®æšãããå Žåããã®é ç¹ããŒã¿ã®ã³ããŒã1000åGPUã¡ã¢ãªã«ããŒãããããªããããããŸãããçŸä»£ã®ãšã³ãžã³ã¯ããããè³¢ãã§ãããåã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠåå¥ã®åœä»€ã管çãéä¿¡ãããšããæŠå¿µçãªãªãŒããŒãããã¯æ®ããŸãã
ãããã®èŠå ã环ç©ããçµæãåå¥ã®æç»ã³ãŒã«ã䜿çšããŠæ°åã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ãããšãç¹ã«CPUã®æ§èœãäœãããŸãã¯ã¡ã¢ãªåž¯åå¹ ãéãããŠããããã€ã¹ã§ã¯ããã¬ãŒã ã¬ãŒããæ¥µç«¯ã«äœããªãå¯èœæ§ããããŸãã倿§ãªãŠãŒã¶ãŒããŒã¹ã«å¯Ÿå¿ããã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠããã®ããã©ãŒãã³ã¹åé¡ã¯ããã«éèŠã«ãªããŸãããžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãå€ãã®æç»ã³ãŒã«ãäžã€ã«çµ±åããããšã§ãããã®èª²é¡ã«çŽæ¥å¯ŸåŠããCPUã®äœæ¥è² è·ãåçã«åæžããGPUãããå¹ççã«åäœã§ããããã«ããŸãã
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ãšã¯äœãïŒ
ãã®æ žå¿ã«ãããŠãWebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãGPUãåäžã®æç»ã³ãŒã«ã䜿çšããŠåãé ç¹ã®ã»ãããè€æ°åæç»ãããããåãã€ã³ã¹ã¿ã³ã¹ãã«ã¯ãŠããŒã¯ãªããŒã¿ãæãããããšãå¯èœã«ãããã¯ããã¯ã§ããåãªããžã§ã¯ãã®å®å šãªãžãªã¡ããªãšãã®å€æããŒã¿ãåå¥ã«éä¿¡ãã代ããã«ããžãªã¡ããªããŒã¿ãäžåºŠã ãéä¿¡ãããã®åŸãã€ã³ã¹ã¿ã³ã¹ããšã«å€åããå¥ã®å°ããªããŒã¿ã»ããïŒäœçœ®ãå転ãã¹ã±ãŒã«ãè²ãªã©ïŒãæäŸããŸãã
ãããæ¬¡ã®ããã«èããŠã¿ãŠãã ããïŒ
- ã€ã³ã¹ã¿ã³ã·ã³ã°ãªãïŒ 1000åã®ã¯ãããŒãçŒãããšãæ³åããŠãã ãããã¯ãããŒããšã«çå°ã䌞ã°ããåãã¯ãããŒã«ãã¿ãŒã§åãæãããã¬ã€ã«çœ®ããåå¥ã«é£Ÿãä»ããããŠãããªãŒãã³ã«å ¥ããŸããããã¯å埩çã§æéãããããŸãã
- ã€ã³ã¹ã¿ã³ã·ã³ã°ããïŒ å€§ããªçå°ã·ãŒããäžåºŠã ã䌞ã°ããŸããæ¬¡ã«ãåãã¯ãããŒã«ãã¿ãŒã䜿ã£ãŠ1000åã®ã¯ãããŒãåæã«ããããã¯çå°ãå床æºåããããšãªãé£ç¶ããŠçŽ æ©ãåãæããŸããåã¯ãããŒã«ã¯å°ãç°ãªã食ãä»ãïŒã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ïŒãæœããããããããŸããããåºæ¬çãªåœ¢ç¶ïŒãžãªã¡ããªïŒã¯å ±æãããå¹ççã«åŠçãããŸãã
WebGLã§ã¯ãããã¯æ¬¡ã®ããã«å€æãããŸãïŒ
- å ±æãããé ç¹ããŒã¿ïŒ 3Dã¢ãã«ïŒäŸãã°ãæšãè»ããã«ãã£ã³ã°ãããã¯ïŒã¯ãæšæºçãªé ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒãšãå Žåã«ãã£ãŠã¯ã€ã³ããã¯ã¹ãããã¡ãªããžã§ã¯ãïŒIBOïŒã䜿çšããŠäžåºŠã ãå®çŸ©ãããŸãããã®ããŒã¿ã¯GPUã«äžåºŠã ãã¢ããããŒããããŸãã
- ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ïŒ ã¢ãã«ã®åã ã®ã³ããŒããããã«å¯ŸããŠã远å ã®å±æ§ãæäŸããŸãããããã®å±æ§ã«ã¯éåžžã4x4ã®å€æè¡åïŒäœçœ®ãå転ãã¹ã±ãŒã«çšïŒãå«ãŸããŸãããè²ããã¯ã¹ãã£ãªãã»ããããŸãã¯ã€ã³ã¹ã¿ã³ã¹å士ãåºå¥ããä»ã®ããããã£ãå¯èœã§ãããã®ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ãGPUã«ã¢ããããŒããããŸãããéèŠãªã®ã¯ããããç¹å¥ãªæ¹æ³ã§æ§æãããããšã§ãã
- åäžã®æç»ã³ãŒã«ïŒ
gl.drawElements()ãgl.drawArrays()ãäœååãåŒã³åºã代ããã«ãgl.drawElementsInstanced()ãgl.drawArraysInstanced()ã®ãããªç¹æ®ãªã€ã³ã¹ã¿ã³ã·ã³ã°æç»ã³ãŒã«ã䜿çšããŸãããããã®ã³ãã³ãã¯GPUã«ãããã®ãžãªã¡ããªãNåæç»ããåã€ã³ã¹ã¿ã³ã¹ã«ã¯æ¬¡ã®ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã»ããã䜿çšããããšäŒããŸãã
GPUã¯ãã®åŸãåã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠå ±æãžãªã¡ããªãå¹ççã«åŠçããé ç¹ã·ã§ãŒããŒå ã§ãŠããŒã¯ãªã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ãé©çšããŸããããã«ãããCPUããé«åºŠã«äžŠååãããGPUãžãšäœæ¥ãå€§å¹ ã«ãªãããŒããããGPUã¯ãã®ãããªå埩çãªã¿ã¹ã¯ã«ã¯ããã«é©ããŠãããããåçãªããã©ãŒãã³ã¹åäžã«ã€ãªãããŸãã
WebGL 1 vs. WebGL 2ïŒã€ã³ã¹ã¿ã³ã·ã³ã°ã®é²å
ãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®å©çšå¯èœæ§ãšå®è£ ã¯ãWebGL 1.0ãšWebGL 2.0ã§ç°ãªããŸãããããã®éããçè§£ããããšã¯ãå ç¢ã§åºç¯ãªäºææ§ãæã€Webã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ãéçºããäžã§éåžžã«éèŠã§ãã
WebGL 1.0ïŒæ¡åŒµæ©èœïŒANGLE_instanced_arraysïŒ
WebGL 1.0ãæåã«å°å
¥ããããšããã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ã³ã¢æ©èœã§ã¯ãããŸããã§ãããããã䜿çšããã«ã¯ãéçºè
ã¯ãã³ããŒæ¡åŒµæ©èœã§ããANGLE_instanced_arraysã«äŸåããå¿
èŠããããŸããããã®æ¡åŒµæ©èœã¯ãã€ã³ã¹ã¿ã³ã¹åã¬ã³ããªã³ã°ãæå¹ã«ããããã«å¿
èŠãªAPIã³ãŒã«ãæäŸããŸãã
WebGL 1.0ã€ã³ã¹ã¿ã³ã·ã³ã°ã®äž»ãªåŽé¢ïŒ
- æ¡åŒµæ©èœã®æ€åºïŒ
gl.getExtension('ANGLE_instanced_arrays')ã䜿çšããŠæ¡åŒµæ©èœãæç€ºçã«åãåãããæå¹ã«ããå¿ èŠããããŸãã - æ¡åŒµæ©èœåºæã®é¢æ°ïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°æç»ã³ãŒã«ïŒäŸïŒ
drawElementsInstancedANGLEïŒã屿§é€æ°é¢æ°ïŒvertexAttribDivisorANGLEïŒã«ã¯ANGLEãšããæ¥é èŸãä»ããŸãã - äºææ§ïŒ çŸä»£ã®ãã©ãŠã¶ã§ã¯åºããµããŒããããŠããŸãããæ¡åŒµæ©èœã«äŸåãããšãå€ããã©ãããã©ãŒã ãããŸãäžè¬çã§ãªããã©ãããã©ãŒã ã§åŸ®åŠãªå·®ç°ãäºææ§ã®åé¡ãçããããšããããŸãã
- ããã©ãŒãã³ã¹ïŒ ããã§ããªããã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããªãã¬ã³ããªã³ã°ã«æ¯ã¹ãŠå€§å¹ ãªããã©ãŒãã³ã¹åäžãæäŸããŸãã
WebGL 2.0ïŒã³ã¢æ©èœïŒ
OpenGL ES 3.0ãããŒã¹ãšããWebGL 2.0ã«ã¯ãã€ã³ã¹ã¿ã³ã·ã³ã°ãã³ã¢æ©èœãšããŠå«ãŸããŠããŸããããã«ãããæ¡åŒµæ©èœãæç€ºçã«æå¹ã«ããå¿ èŠããªããªããéçºè ã®ã¯ãŒã¯ãããŒãç°¡çŽ åããããã¹ãŠã®æºæ ããWebGL 2.0ç°å¢ã§äžè²«ããåäœãä¿èšŒãããŸãã
WebGL 2.0ã€ã³ã¹ã¿ã³ã·ã³ã°ã®äž»ãªåŽé¢ïŒ
- æ¡åŒµæ©èœã¯äžèŠïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°é¢æ°ïŒ
gl.drawElementsInstanced,gl.drawArraysInstanced,gl.vertexAttribDivisorïŒã¯ãWebGLã¬ã³ããªã³ã°ã³ã³ããã¹ãã§çŽæ¥å©çšã§ããŸãã - ãµããŒãã®ä¿èšŒïŒ ãã©ãŠã¶ãWebGL 2.0ããµããŒãããŠããã°ãã€ã³ã¹ã¿ã³ã·ã³ã°ã®ãµããŒããä¿èšŒãããå®è¡æã®ãã§ãã¯ãäžèŠã«ãªããŸãã
- ã·ã§ãŒããŒèšèªã®æ©èœïŒ WebGL 2.0ã®GLSL ES 3.00ã·ã§ãŒãã£ã³ã°èšèªã¯ãé ç¹ã·ã§ãŒããŒã§çŸåšã®ã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ããã¯ã¹ãæäŸããç¹å¥ãªå
¥å倿°
gl_InstanceIDãçµã¿èŸŒã¿ã§ãµããŒãããŠããŸããããã«ãããã·ã§ãŒããŒã®ããžãã¯ãç°¡çŽ åãããŸãã - ããåºç¯ãªæ©èœïŒ WebGL 2.0ã¯ããã©ã³ã¹ãã©ãŒã ãã£ãŒãããã¯ããã«ãã¬ã³ããŒã¿ãŒã²ãããããé«åºŠãªãã¯ã¹ãã£ãã©ãŒããããªã©ãè€éãªã·ãŒã³ã§ã€ã³ã¹ã¿ã³ã·ã³ã°ãè£å®ã§ããä»ã®ããã©ãŒãã³ã¹ããã³æ©èœã®åŒ·åãæäŸããŸãã
æšå¥šäºé
ïŒ æ°ãããããžã§ã¯ãã§æé«ã®ããã©ãŒãã³ã¹ãç®æãå Žåãåºç¯ãªãã©ãŠã¶äºææ§ã絶察çãªå¶çŽã§ãªãéããWebGL 2.0ãã¿ãŒã²ããã«ããããšã匷ããå§ãããŸãïŒWebGL 2.0ã¯æ®éçã§ã¯ãªããã®ã®ãåªãããµããŒããæã£ãŠããŸãïŒãå€ãããã€ã¹ãšã®ããåºãäºææ§ãéèŠãªå Žåã¯ãANGLE_instanced_arraysæ¡åŒµæ©èœã䜿çšããWebGL 1.0ãžã®ãã©ãŒã«ããã¯ããŸãã¯WebGL 2.0ãåªå
ããWebGL 1.0ãã¹ããã©ãŒã«ããã¯ãšããŠäœ¿çšãããã€ããªããã¢ãããŒããå¿
èŠã«ãªããããããŸããã
ã€ã³ã¹ã¿ã³ã·ã³ã°ã®ä»çµã¿ãçè§£ãã
ã€ã³ã¹ã¿ã³ã·ã³ã°ã广çã«å®è£ ããããã«ã¯ãå ±æãžãªã¡ããªãšã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ãGPUã«ãã£ãŠã©ã®ããã«æ±ãããããçè§£ããå¿ èŠããããŸãã
å ±æãžãªã¡ããªããŒã¿
ãªããžã§ã¯ãã®å¹ŸäœåŠçå®çŸ©ïŒäŸïŒå²©ããã£ã©ã¯ã¿ãŒãä¹ãç©ã®3Dã¢ãã«ïŒã¯ãæšæºçãªãããã¡ãªããžã§ã¯ãã«æ ŒçŽãããŸãïŒ
- é ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒïŒ ãããã¯ã¢ãã«ã®çã®é ç¹ããŒã¿ãä¿æããŸããããã«ã¯äœçœ®ïŒ
a_positionïŒãæ³ç·ãã¯ãã«ïŒa_normalïŒããã¯ã¹ãã£åº§æšïŒa_texCoordïŒããããŠå Žåã«ãã£ãŠã¯æ¥ç·/åŸæ³ç·ãã¯ãã«ãªã©ã®å±æ§ãå«ãŸããŸãããã®ããŒã¿ã¯GPUã«äžåºŠã ãã¢ããããŒããããŸãã - ã€ã³ããã¯ã¹ãããã¡ãªããžã§ã¯ãïŒIBOïŒ/ ãšã¬ã¡ã³ããããã¡ãªããžã§ã¯ãïŒEBOïŒïŒ ãžãªã¡ããªãã€ã³ããã¯ã¹ä»ãæç»ã䜿çšããŠããå ŽåïŒå ±æé ç¹ã®é ç¹ããŒã¿ãè€è£œããªããããå¹çã®èгç¹ããåŒ·ãæšå¥šãããŸãïŒãé ç¹ãã©ã®ããã«äžè§åœ¢ã圢æããããå®çŸ©ããã€ã³ããã¯ã¹ãIBOã«æ ŒçŽãããŸãããããäžåºŠã ãã¢ããããŒããããŸãã
ã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšãããšãGPUã¯åã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠå ±æãžãªã¡ããªã®é ç¹ãå埩åŠçããã€ã³ã¹ã¿ã³ã¹åºæã®å€æããã®ä»ã®ããŒã¿ãé©çšããŸãã
ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ïŒå·®å¥åã®éµ
ãããã€ã³ã¹ã¿ã³ã·ã³ã°ãåŸæ¥ã®ã¬ã³ããªã³ã°ãšç°ãªãç¹ã§ããåæç»ã³ãŒã«ã§ãã¹ãŠã®ãªããžã§ã¯ãããããã£ãéä¿¡ãã代ããã«ãã€ã³ã¹ã¿ã³ã¹ããšã«å€åããããŒã¿ãä¿æããããã®å¥ã®ãããã¡ãäœæããŸãããã®ããŒã¿ã¯ã€ã³ã¹ã¿ã³ã¹åããã屿§ãšããŠç¥ãããŠããŸãã
-
å
å®¹ïŒ äžè¬çãªã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ã¢ãã«è¡åïŒ åã€ã³ã¹ã¿ã³ã¹ã®äœçœ®ãå転ãã¹ã±ãŒã«ãçµã¿åããã4x4è¡åãããã¯æãäžè¬çã§åŒ·åãªã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã§ãã
- è²ïŒ åã€ã³ã¹ã¿ã³ã¹ã®ãŠããŒã¯ãªè²ã
- ãã¯ã¹ãã£ãªãã»ãã/ã€ã³ããã¯ã¹ïŒ ãã¯ã¹ãã£ã¢ãã©ã¹ãé åã䜿çšããŠããå Žåãç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«äœ¿çšãããã¯ã¹ãã£ãããã®éšåãæå®ã§ããŸãã
- ã«ã¹ã¿ã ããŒã¿ïŒ ç©çç¶æ ãäœåå€ãã¢ãã¡ãŒã·ã§ã³ã®ãã§ãŒãºãªã©ãã€ã³ã¹ã¿ã³ã¹ãåºå¥ããã®ã«åœ¹ç«ã€ãã®ä»ã®æ°å€ããŒã¿ã
-
æž¡ãæ¹ïŒã€ã³ã¹ã¿ã³ã¹åé
åïŒ ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã¯ãéåžžã®é ç¹å±æ§ãšåæ§ã«1ã€ä»¥äžã®VBOã«æ ŒçŽãããŸããæ±ºå®çãªéãã¯ããããã®å±æ§ã
gl.vertexAttribDivisor()ã䜿çšããŠã©ã®ããã«èšå®ããããã§ãã -
gl.vertexAttribDivisor(attributeLocation, divisor)ïŒ ãã®é¢æ°ã¯ã€ã³ã¹ã¿ã³ã·ã³ã°ã®åºç€ã§ããããã¯WebGLã«å±æ§ãã©ã®ãããã®é »åºŠã§æŽæ°ãããã¹ãããäŒããŸãïŒdivisorã0ïŒéåžžã®å±æ§ã®ããã©ã«ãïŒã®å Žåã屿§ã®å€ã¯ãã¹ãŠã®é ç¹ã§å€åããŸããdivisorã1ã®å Žåã屿§ã®å€ã¯ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§å€åããŸããããã¯ãåäžã€ã³ã¹ã¿ã³ã¹å ã®ãã¹ãŠã®é ç¹ã«å¯ŸããŠã屿§ã¯ãããã¡ããåãå€ã䜿çšããæ¬¡ã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããã¡å ã®æ¬¡ã®å€ã«é²ãããšãæå³ããŸããdivisorã®ä»ã®å€ïŒäŸïŒ2, 3ïŒãå¯èœã§ãããããŸãäžè¬çã§ã¯ãªãã屿§ãNã€ã³ã¹ã¿ã³ã¹ããšã«å€åããããšã瀺ããŸãã
-
ã·ã§ãŒããŒå
ã®
gl_InstanceIDïŒ é ç¹ã·ã§ãŒããŒïŒç¹ã«WebGL 2.0ã®GLSL ES 3.00ïŒã§ã¯ãgl_InstanceIDãšããååã®çµã¿èŸŒã¿å ¥å倿°ããçŸåšã¬ã³ããªã³ã°ãããŠããã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ããã¯ã¹ãæäŸããŸããããã¯ãé åããã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã«çŽæ¥ã¢ã¯ã»ã¹ããããã€ã³ã¹ã¿ã³ã¹ã€ã³ããã¯ã¹ã«åºã¥ããŠãŠããŒã¯ãªå€ãèšç®ãããããã®ã«éåžžã«äŸ¿å©ã§ããWebGL 1.0ã§ã¯ãéåžžãé ç¹ã·ã§ãŒããŒãããã©ã°ã¡ã³ãã·ã§ãŒããŒãžgl_InstanceIDãvaryingãšããŠæž¡ãããããäžè¬çã«ã¯ãå¿ èŠãªããŒã¿ããã¹ãŠå±æ§ã«å«ãŸããŠããã°ãæç€ºçãªIDãå¿ èŠãšããã«ã€ã³ã¹ã¿ã³ã¹å±æ§ã«çŽæ¥äŸåããŸãã
ãããã®ã¡ã«ããºã ã䜿çšããããšã§ãGPUã¯ãžãªã¡ããªãäžåºŠå¹ççã«ååŸããåã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠãã®ãŠããŒã¯ãªããããã£ãšçµã¿åãããããã«å¿ããŠå€æããã³ã·ã§ãŒãã£ã³ã°ãè¡ãããšãã§ããŸãããã®äžŠååŠçèœåããéåžžã«è€éãªã·ãŒã³ã§ã€ã³ã¹ã¿ã³ã·ã³ã°ãããã»ã©åŒ·åã«ããçç±ã§ãã
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®å®è£ ïŒã³ãŒãäŸïŒ
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®ç°¡åãªå®è£ ãé ã远ã£ãŠèŠãŠãããŸããããããã§ã¯ãåçŽãªåœ¢ç¶ïŒç«æ¹äœãªã©ïŒã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ããç°ãªãäœçœ®ãšè²ã§ã¬ã³ããªã³ã°ããããšã«çŠç¹ãåœãŠãŸãããã®äŸã¯ãWebGLã³ã³ããã¹ãã®èšå®ãšã·ã§ãŒããŒã³ã³ãã€ã«ã®åºæ¬çãªçè§£ãåæãšããŠããŸãã
1. åºæ¬çãªWebGLã³ã³ããã¹ããšã·ã§ãŒããŒããã°ã©ã
ãŸããWebGL 2.0ã³ã³ããã¹ããšåºæ¬çãªã·ã§ãŒããŒããã°ã©ã ãèšå®ããŸãã
é ç¹ã·ã§ãŒããŒïŒvertexShaderSourceïŒïŒ
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec4 a_color;
layout(location = 2) in mat4 a_modelMatrix;
uniform mat4 u_viewProjectionMatrix;
out vec4 v_color;
void main() {
v_color = a_color;
gl_Position = u_viewProjectionMatrix * a_modelMatrix * a_position;
}
ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒfragmentShaderSourceïŒïŒ
#version 300 es
precision highp float;
in vec4 v_color;
out vec4 outColor;
void main() {
outColor = v_color;
}
mat4ã§ããa_modelMatrix屿§ã«æ³šç®ããŠãã ããããããã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã«ãªããŸããmat4ã¯4ã€ã®vec4ãã±ãŒã·ã§ã³ãå æããããã屿§ãªã¹ãã®ãã±ãŒã·ã§ã³2ã3ã4ã5ã䜿çšããŸããããã§ã¯a_colorãã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã§ãã
2. å ±æãžãªã¡ããªããŒã¿ã®äœæïŒäŸïŒç«æ¹äœïŒ
åçŽãªç«æ¹äœã®é ç¹äœçœ®ãå®çŸ©ããŸããç°¡åã«ããããã«ãçŽæ¥é åã䜿çšããŸãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯IBOã䜿çšããã€ã³ããã¯ã¹ä»ãæç»ã䜿çšããŸãã
const positions = [
// åé¢
-0.5, -0.5, 0.5,
0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, 0.5,
// èé¢
-0.5, -0.5, -0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, -0.5,
-0.5, -0.5, -0.5,
0.5, 0.5, -0.5,
0.5, -0.5, -0.5,
// äžé¢
-0.5, 0.5, -0.5,
-0.5, 0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, 0.5,
0.5, 0.5, -0.5,
// åºé¢
-0.5, -0.5, -0.5,
0.5, -0.5, -0.5,
0.5, -0.5, 0.5,
-0.5, -0.5, -0.5,
0.5, -0.5, 0.5,
-0.5, -0.5, 0.5,
// å³é¢
0.5, -0.5, -0.5,
0.5, 0.5, -0.5,
0.5, 0.5, 0.5,
0.5, -0.5, -0.5,
0.5, 0.5, 0.5,
0.5, -0.5, 0.5,
// å·Šé¢
-0.5, -0.5, -0.5,
-0.5, -0.5, 0.5,
-0.5, 0.5, 0.5,
-0.5, -0.5, -0.5,
-0.5, 0.5, 0.5,
-0.5, 0.5, -0.5
];
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
// äœçœ®ã®é ç¹å±æ§ãèšå® (ãã±ãŒã·ã§ã³ 0)
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.vertexAttribDivisor(0, 0); // 逿° 0: 屿§ã¯é ç¹ããšã«å€å
3. ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã®äœæïŒè¡åãšè²ïŒ
åã€ã³ã¹ã¿ã³ã¹ã®å€æè¡åãšè²ãçæããŸããäŸãšããŠãã°ãªããç¶ã«é 眮ããã1000åã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
const numInstances = 1000;
const instanceMatrices = new Float32Array(numInstances * 16); // mat4ããã16æµ®åå°æ°ç¹æ°
const instanceColors = new Float32Array(numInstances * 4); // vec4ããã4æµ®åå°æ°ç¹æ° (RGBA)
// ã€ã³ã¹ã¿ã³ã¹ããŒã¿ãèšå®
for (let i = 0; i < numInstances; ++i) {
const matrixOffset = i * 16;
const colorOffset = i * 4;
const x = (i % 30) * 1.5 - 22.5; // ã°ãªããã¬ã€ã¢ãŠãã®äŸ
const y = Math.floor(i / 30) * 1.5 - 22.5;
const z = (Math.sin(i * 0.1) * 5);
const rotation = i * 0.05; // å転ã®äŸ
const scale = 0.5 + Math.sin(i * 0.03) * 0.2; // ã¹ã±ãŒã«ã®äŸ
// åã€ã³ã¹ã¿ã³ã¹ã®ã¢ãã«è¡åãäœæ (gl-matrixã®ãããªæ°åŠã©ã€ãã©ãªã䜿çš)
const m = mat4.create();
mat4.translate(m, m, [x, y, z]);
mat4.rotateY(m, m, rotation);
mat4.scale(m, m, [scale, scale, scale]);
// è¡åãinstanceMatricesé
åã«ã³ããŒ
instanceMatrices.set(m, matrixOffset);
// åã€ã³ã¹ã¿ã³ã¹ã«ã©ã³ãã ãªè²ãå²ãåœãŠ
instanceColors[colorOffset + 0] = Math.random();
instanceColors[colorOffset + 1] = Math.random();
instanceColors[colorOffset + 2] = Math.random();
instanceColors[colorOffset + 3] = 1.0; // ã¢ã«ãã¡å€
}
// ã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ãäœæããŠããŒã¿ãæ ŒçŽ
const instanceMatrixBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, instanceMatrixBuffer);
gl.bufferData(gl.ARRAY_BUFFER, instanceMatrices, gl.DYNAMIC_DRAW); // ããŒã¿ã倿Žãããå Žåã¯DYNAMIC_DRAWã䜿çš
const instanceColorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, instanceColorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, instanceColors, gl.DYNAMIC_DRAW);
4. ã€ã³ã¹ã¿ã³ã¹ããšã®VBOã屿§ã«ãªã³ã¯ãã逿°ãèšå®
ãããã€ã³ã¹ã¿ã³ã·ã³ã°ã®éèŠãªã¹ãããã§ãããããã®å±æ§ãé ç¹ããšã§ã¯ãªããã€ã³ã¹ã¿ã³ã¹ããšã«äžåºŠã ãå€åããããšãWebGLã«äŒããŸãã
// ã€ã³ã¹ã¿ã³ã¹ã®è²ã®å±æ§ãèšå® (ãã±ãŒã·ã§ã³ 1)
gl.enableVertexAttribArray(1);
gl.bindBuffer(gl.ARRAY_BUFFER, instanceColorBuffer);
gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);
gl.vertexAttribDivisor(1, 1); // 逿° 1: 屿§ã¯ã€ã³ã¹ã¿ã³ã¹ããšã«å€å
// ã€ã³ã¹ã¿ã³ã¹ã®ã¢ãã«è¡åã®å±æ§ãèšå® (ãã±ãŒã·ã§ã³ 2, 3, 4, 5)
// mat4ã¯4ã€ã®vec4ãªã®ã§ã4ã€ã®å±æ§ãã±ãŒã·ã§ã³ãå¿
èŠ
const matrixLocation = 2; // a_modelMatrixã®éå§ãã±ãŒã·ã§ã³
gl.bindBuffer(gl.ARRAY_BUFFER, instanceMatrixBuffer);
for (let i = 0; i < 4; ++i) {
gl.enableVertexAttribArray(matrixLocation + i);
gl.vertexAttribPointer(
matrixLocation + i, // location (ãã±ãŒã·ã§ã³)
4, // size (vec4)
gl.FLOAT, // type (å)
false, // normalize (æ£èŠå)
16 * 4, // stride (mat4ã®ãµã€ãº = 16 float * 4 byte/float)
i * 4 * 4 // offset (åvec4åã®ãªãã»ãã)
);
gl.vertexAttribDivisor(matrixLocation + i, 1); // 逿° 1: 屿§ã¯ã€ã³ã¹ã¿ã³ã¹ããšã«å€å
}
5. ã€ã³ã¹ã¿ã³ã¹åãããæç»ã³ãŒã«
æåŸã«ãåäžã®æç»ã³ãŒã«ã§ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãã¬ã³ããªã³ã°ããŸããããã§ã¯ãç«æ¹äœããšã«36åã®é ç¹ïŒ6é¢ * 2äžè§åœ¢/é¢ * 3é ç¹/äžè§åœ¢ïŒãnumInstancesåæç»ããŸãã
function render() {
// ... (viewProjectionMatrixãæŽæ°ããuniformãã¢ããããŒã)
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
// ã·ã§ãŒããŒããã°ã©ã ã䜿çš
gl.useProgram(program);
// ãžãªã¡ããªãããã¡ïŒäœçœ®ïŒããã€ã³ã - 屿§èšå®ã§ãã§ã«ãã€ã³ãæžã¿
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
// ã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã¯ããã§ã«ãã€ã³ãããã逿°ãèšå®ãããŠãã
// ãã ããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãæŽæ°ãããå Žåã¯ãããã§åãããã¡ãªã³ã°ãã
// gl.bindBuffer(gl.ARRAY_BUFFER, instanceMatrixBuffer);
// gl.bufferData(gl.ARRAY_BUFFER, instanceMatrices, gl.DYNAMIC_DRAW);
gl.drawArraysInstanced(
gl.TRIANGLES, // mode (ã¢ãŒã)
0, // æåã®é ç¹
36, // count (ã€ã³ã¹ã¿ã³ã¹ããšã®é ç¹æ°ãç«æ¹äœã¯36)
numInstances // instanceCount (ã€ã³ã¹ã¿ã³ã¹æ°)
);
requestAnimationFrame(render);
}
render(); // ã¬ã³ããªã³ã°ã«ãŒããéå§
ãã®æ§é ã¯ãäžå¿çãªååã瀺ããŠããŸããå
±æã®positionBufferã¯é€æ°0ã§èšå®ããããã®å€ãåé ç¹ã«å¯ŸããŠé 次䜿çšãããããšãæå³ããŸããinstanceColorBufferãšinstanceMatrixBufferã¯é€æ°1ã§èšå®ããããã®å€ãã€ã³ã¹ã¿ã³ã¹ããšã«äžåºŠã ãååŸãããããšãæå³ããŸãããããŠãgl.drawArraysInstancedã³ãŒã«ããã¹ãŠã®ç«æ¹äœãäžåºŠã«å¹ççã«ã¬ã³ããªã³ã°ããŸãã
é«åºŠãªã€ã³ã¹ã¿ã³ã·ã³ã°ãã¯ããã¯ãšèæ ®äºé
åºæ¬çãªå®è£ ã¯çµ¶å€§ãªããã©ãŒãã³ã¹äžã®å©ç¹ãæäŸããŸãããé«åºŠãªãã¯ããã¯ã«ãã£ãŠã€ã³ã¹ã¿ã³ã¹åã¬ã³ããªã³ã°ãããã«æé©åãã匷åããããšãã§ããŸãã
ã€ã³ã¹ã¿ã³ã¹ã®ã«ãªã³ã°
äœåãäœçŸäžãã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ããããšã¯ãã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿ã£ãŠãããã®å€§éšåãã«ã¡ã©ã®èŠçïŒãã©ã¹ã¿ã ïŒã®å€ã«ããããä»ã®ãªããžã§ã¯ãã«é ãããŠããïŒãªã¯ã«ãŒããããŠããïŒå Žåã«ã¯ãäŸç¶ãšããŠè² è·ãé«ãããšããããŸããã«ãªã³ã°ãå®è£ ããããšã§ãGPUã®äœæ¥è² è·ãå€§å¹ ã«åæžã§ããŸãã
-
ãã©ã¹ã¿ã ã«ãªã³ã°ïŒ ãã®ãã¯ããã¯ã¯ãåã€ã³ã¹ã¿ã³ã¹ã®å¢çããªã¥ãŒã ïŒäŸïŒããŠã³ãã£ã³ã°ããã¯ã¹ãã¹ãã£ã¢ïŒãã«ã¡ã©ã®èŠéå°ãšäº€å·®ãããã©ããããã§ãã¯ããŸããã€ã³ã¹ã¿ã³ã¹ãå®å
šã«ãã©ã¹ã¿ã ã®å€ã«ããå Žåããã®ããŒã¿ã¯ã¬ã³ããªã³ã°åã«ã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ããé€å€ã§ããŸããããã«ãããæç»ã³ãŒã«ã®
instanceCountãæžå°ããŸãã- å®è£ ïŒ å€ãã®å ŽåãCPUäžã§è¡ãããŸããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ãæŽæ°ããåã«ããã¹ãŠã®æœåšçãªã€ã³ã¹ã¿ã³ã¹ãå埩åŠçãããã©ã¹ã¿ã ãã¹ããå®è¡ããå¯èŠã€ã³ã¹ã¿ã³ã¹ã®ããŒã¿ã®ã¿ããããã¡ã«è¿œå ããŸãã
- ããã©ãŒãã³ã¹ã®ãã¬ãŒããªãïŒ GPUã®äœæ¥ãç¯çŽããäžæ¹ã§ãCPUã®ã«ãªã³ã°ããžãã¯èªäœãéåžžã«å€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠããã«ããã¯ã«ãªãå¯èœæ§ããããŸããæ°çŸäžã®ã€ã³ã¹ã¿ã³ã¹ã®å Žåããã®CPUã³ã¹ããã€ã³ã¹ã¿ã³ã·ã³ã°ã®å©ç¹ã®äžéšãçžæ®ºãããããããŸããã
- ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ïŒ ããã¯ããè€éã§ãä»ã®ãªããžã§ã¯ãã®èåŸã«é ããŠããã€ã³ã¹ã¿ã³ã¹ã®ã¬ã³ããªã³ã°ãé¿ããããšãç®çãšããŠããŸããããã¯éåžžãéå±€çZãããã¡ãªã³ã°ã®ãããªãã¯ããã¯ã䜿çšããããããŠã³ãã£ã³ã°ããã¯ã¹ãã¬ã³ããªã³ã°ããŠGPUã«å¯èŠæ§ãåãåããããããããšã§ãGPUäžã§è¡ãããŸããããã¯åºæ¬çãªã€ã³ã¹ã¿ã³ã·ã³ã°ã¬ã€ãã®ç¯å²ãè¶ ããŸãããå¯éããã·ãŒã³ã«å¯Ÿãã匷åãªæé©åã§ãã
ã€ã³ã¹ã¿ã³ã¹ã®LOD (Level of Detail)
é ãã®ãªããžã§ã¯ãã«å¯ŸããŠãé«è§£å床ã®ã¢ãã«ã¯ãã°ãã°äžèŠã§ãããç¡é§ã§ããLODã·ã¹ãã ã¯ãã€ã³ã¹ã¿ã³ã¹ã®ã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠãã¢ãã«ã®ç°ãªãããŒãžã§ã³ïŒããªãŽã³æ°ããã¯ã¹ãã£ã®è©³çŽ°åºŠãç°ãªãïŒãåçã«åãæ¿ããŸãã
- å®è£
ïŒ ããã¯ãè€æ°ã®å
±æãžãªã¡ããªãããã¡ã»ããïŒäŸïŒ
cube_high_lod_positions,cube_medium_lod_positions,cube_low_lod_positionsïŒãæã€ããšã§å®çŸã§ããŸãã - æŠç¥ïŒ ã€ã³ã¹ã¿ã³ã¹ãå¿ èŠãªLODããšã«ã°ã«ãŒãåããŸããæ¬¡ã«ãåLODã°ã«ãŒãã«å¯ŸããŠåå¥ã®ã€ã³ã¹ã¿ã³ã¹åæç»ã³ãŒã«ãå®è¡ããåã°ã«ãŒãã«å¯Ÿå¿ããé©åãªãžãªã¡ããªãããã¡ããã€ã³ãããŸããäŸãã°ã50ãŠããã以å ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯LOD 0ãã50-200ãŠãããã¯LOD 1ãã200ãŠããã以äžã¯LOD 2ã䜿çšããŸãã
- å©ç¹ïŒ è¿ãã®ãªããžã§ã¯ãã®èŠèŠå質ãç¶æãã€ã€ãé ãã®ãªããžã§ã¯ãã®å¹ŸäœåŠçè€éãã軜æžããGPUã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããŸãã
åçã€ã³ã¹ã¿ã³ã·ã³ã°ïŒã€ã³ã¹ã¿ã³ã¹ããŒã¿ã®å¹ççãªæŽæ°
å€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãæéãšãšãã«ç§»åããããè²ãå€ãã£ãããã¢ãã¡ãŒã·ã§ã³ãããããå¿ èŠããããŸããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ãé »ç¹ã«æŽæ°ããããšãéèŠã§ãã
- ãããã¡ã®äœ¿çšæ³ïŒ ã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ãäœæããéã«ã¯ã
gl.STATIC_DRAWã®ä»£ããã«gl.DYNAMIC_DRAWãŸãã¯gl.STREAM_DRAWã䜿çšããŸããããã¯ãããŒã¿ãé »ç¹ã«æŽæ°ãããããšãGPUãã©ã€ãã«ç€ºåããŸãã - æŽæ°é »åºŠïŒ ã¬ã³ããªã³ã°ã«ãŒãå
ã§ãCPUäžã®
instanceMatricesãinstanceColorsé åã倿Žãããã®åŸãé åå šäœïŒãŸãã¯äžéšã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ã倿Žãããå Žåã¯ãã®ãµãã¬ã³ãžïŒãgl.bufferData()ãŸãã¯gl.bufferSubData()ã䜿çšããŠGPUã«åã¢ããããŒãããŸãã - ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ïŒ ã€ã³ã¹ã¿ã³ã¹ããŒã¿ã®æŽæ°ã¯å¹ççã§ãããéåžžã«å€§ããªãããã¡ãç¹°ãè¿ãã¢ããããŒãããããšã¯äŸç¶ãšããŠããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã倿Žãããéšåã®ã¿ãæŽæ°ããããè€æ°ã®ãããã¡ãªããžã§ã¯ãïŒãã³ãã³ïŒã®ãããªãã¯ããã¯ã䜿çšããŠGPUã®åæ¢ãé¿ããããšã§æé©åããŸãã
ãããã³ã° vs. ã€ã³ã¹ã¿ã³ã·ã³ã°
ãããã³ã°ãšã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãã©ã¡ããæç»ã³ãŒã«ãæžããããšãç®çãšããŠããŸãããç°ãªãã·ããªãªã«é©ããŠãããããåºå¥ããããšãéèŠã§ãã
-
ãããã³ã°ïŒ è€æ°ã®ç°ãªãïŒãŸãã¯äŒŒãŠãããåäžã§ã¯ãªãïŒãªããžã§ã¯ãã®é ç¹ããŒã¿ãåäžã®ãã倧ããªé ç¹ãããã¡ã«çµåããŸããããã«ããããããã1åã®æç»ã³ãŒã«ã§æç»ã§ããŸãããããªã¢ã«ã¯å
±æãããããžãªã¡ããªãç°ãªãããŸãã¯ã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ãšããŠç°¡åã«è¡šçŸã§ããªãç¬èªã®å€æãæã€ãªããžã§ã¯ãã«åœ¹ç«ã¡ãŸãã
- äŸïŒ è€éãªå»ºç©ãåäžã®æç»ã³ãŒã«ã§ã¬ã³ããªã³ã°ããããã«ãããã€ãã®ãŠããŒã¯ãªå»ºç©ã®ããŒãã1ã€ã®ã¡ãã·ã¥ã«çµ±åããã
-
ã€ã³ã¹ã¿ã³ã·ã³ã°ïŒ åããžãªã¡ããªããç°ãªãã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã§è€æ°åæç»ããŸããã³ããŒããšã«å°æ°ã®ããããã£ã®ã¿ã倿Žããããçã«åäžã®ãžãªã¡ããªã«æé©ã§ãã
- äŸïŒ ãããããç°ãªãäœçœ®ãå転ãã¹ã±ãŒã«ãæã€æ°åæ¬ã®åäžã®æšãã¬ã³ããªã³ã°ããã
- çµã¿åããã¢ãããŒãïŒ å€ãã®å Žåããããã³ã°ãšã€ã³ã¹ã¿ã³ã·ã³ã°ã®çµã¿åãããæè¯ã®çµæããããããŸããäŸãã°ãè€éãªæšã®ç°ãªãéšåãåäžã®ã¡ãã·ã¥ã«ãããã³ã°ãããã®ãããã³ã°ãããæšå šäœãæ°ååã€ã³ã¹ã¿ã³ã·ã³ã°ãããªã©ã§ãã
ããã©ãŒãã³ã¹ã¡ããªã¯ã¹
ã€ã³ã¹ã¿ã³ã·ã³ã°ã®åœ±é¿ãçã«çè§£ããããã«ã¯ãäž»èŠãªããã©ãŒãã³ã¹ææšãç£èŠããŸãïŒ
- æç»ã³ãŒã«æ°ïŒ æãçŽæ¥çãªææšãã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãã®æ°ãåçã«æžããã¯ãã§ãã
- ãã¬ãŒã ã¬ãŒãïŒFPSïŒïŒ FPSãé«ãã»ã©ãå šäœçãªããã©ãŒãã³ã¹ãè¯ãããšã瀺ããŸãã
- CPU䜿çšçïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯éåžžãã¬ã³ããªã³ã°ã«é¢é£ããCPUã®ã¹ãã€ã¯ãæžå°ãããŸãã
- GPU䜿çšçïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯äœæ¥ãGPUã«ãªãããŒãããŸãããããã¯GPUãæç»ã³ãŒã«ããšã«ããå€ãã®äœæ¥ãè¡ãããšãæå³ããŸããGPUã®ãã¬ãŒã æéãç£èŠããŠãä»åºŠã¯GPUããŠã³ãã«ãªã£ãŠããªããã確èªããŸãã
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®å©ç¹
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®æ¡çšã¯ãWebããŒã¹ã®3Dã¢ããªã±ãŒã·ã§ã³ã«æ°å€ãã®å©ç¹ããããããéçºå¹çãããšã³ããŠãŒã¶ãŒäœéšãŸã§ãããããé¢ã«åœ±é¿ãäžããŸãã
- æç»ã³ãŒã«ã®å€§å¹ ãªåæžïŒ ãããäž»èŠãã€æãçŽæ¥çãªå©ç¹ã§ããäœçŸãäœåãã®åå¥ã®æç»ã³ãŒã«ãåäžã®ã€ã³ã¹ã¿ã³ã¹åã³ãŒã«ã«çœ®ãæããããšã§ãCPUã®ãªãŒããŒããããåçã«åæžãããã¯ããã«ã¹ã ãŒãºãªã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãå®çŸããŸãã
- CPUãªãŒããŒãããã®äœæžïŒ CPUãã¬ã³ããªã³ã°ã³ãã³ãã®æºåãšéä¿¡ã«è²»ããæéãå°ãªããªããããç©çã·ãã¥ã¬ãŒã·ã§ã³ãã²ãŒã ããžãã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®æŽæ°ãªã©ãä»ã®ã¿ã¹ã¯ã®ããã®ãªãœãŒã¹ãè§£æŸãããŸããããã¯ãè€éãªã·ãŒã³ã§ã€ã³ã¿ã©ã¯ãã£ããã£ãç¶æããããã«äžå¯æ¬ ã§ãã
- GPUå©çšçã®åäžïŒ çŸä»£ã®GPUã¯é«åºŠãªäžŠååŠççšã«èšèšãããŠããŸããã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãã®åŒ·ã¿ãçŽæ¥æŽ»ãããGPUãåããžãªã¡ããªã®å€ãã®ã€ã³ã¹ã¿ã³ã¹ãåæã«ãã€å¹ççã«åŠçã§ããããã«ããã¬ã³ããªã³ã°æéãççž®ããŸãã
- å€§èŠæš¡ãªã·ãŒã³ã®è€éããå¯èœã«ããïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãéçºè ã以åã¯äžå¯èœã ã£ãæ¡éãã«å€ãã®ãªããžã§ã¯ããæã€ã·ãŒã³ãäœæããããšãå¯èœã«ããŸããäœåãã®è»ãæ©è¡è ãããè³ãããªéœåžãäœçŸäžãã®èãæã€å¯ãªæ£®ããããã¯åºå€§ãªããŒã¿ã»ããã衚çŸããç§åŠçå¯èŠåãªã©ãããããã¹ãŠãWebãã©ãŠã¶å ã§ãªã¢ã«ã¿ã€ã ã«ã¬ã³ããªã³ã°ãããŸãã
- ããé«ãèŠèŠçå¿ å®åºŠãšãªã¢ãªãºã ïŒ ããå€ãã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ã§ããããã«ããããšã§ãã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ããè±ãã§ãæ²¡å ¥æããããä¿¡ææ§ã®ãã3Dç°å¢ã«çŽæ¥è²¢ç®ããŸããããã¯ãããŒããŠã§ã¢ã®åŠçèœåã«é¢ããããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠããé åçãªäœéšã«çŽæ¥ã€ãªãããŸãã
- ã¡ã¢ãªãããããªã³ãã®åæžïŒ ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã¯ä¿åãããŸãããã³ã¢ã®ãžãªã¡ããªããŒã¿ã¯äžåºŠããããŒããããªããããGPUäžã®å šäœçãªã¡ã¢ãªæ¶è²»ãåæžãããŸããããã¯ã¡ã¢ãªãéãããŠããããã€ã¹ã«ãšã£ãŠéèŠã§ãã
- ã¢ã»ãã管çã®ç°¡çŽ åïŒ äŒŒããããªãªããžã§ã¯ãããšã«ãŠããŒã¯ãªã¢ã»ããã管çãã代ããã«ãåäžã®é«å質ãªããŒã¹ã¢ãã«ã«éäžããã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããŠã·ãŒã³ãæ§ç¯ã§ãããããã³ã³ãã³ãäœæãã€ãã©ã€ã³ãåçåãããŸãã
ãããã®å©ç¹ã¯ç·åçã«ã倿§ãªã¯ã©ã€ã¢ã³ãããã€ã¹ã§ã¹ã ãŒãºã«å®è¡ã§ãããããé«éã§å ç¢ããããŠèŠèŠçã«é åçãªWebã¢ããªã±ãŒã·ã§ã³ã«è²¢ç®ããäžçäžã®ã¢ã¯ã»ã·ããªãã£ãšãŠãŒã¶ãŒæºè¶³åºŠãåäžãããŸãã
ããããèœãšã穎ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯åŒ·åã§ãããæ°ããªèª²é¡ãããããããšããããŸãã以äžã¯ãããããèœãšã穎ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ãã³ãã§ãïŒ
-
äžæ£ãª
gl.vertexAttribDivisor()èšå®ïŒ ããã¯æãé »ç¹ã«çºçãããšã©ãŒã®åå ã§ããã€ã³ã¹ã¿ã³ã·ã³ã°çšã®å±æ§ã逿°1ã§èšå®ãããŠããªãå Žåããã®å±æ§ã¯ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§åãå€ã䜿çšãããïŒã°ããŒãã«ãªuniformã®å ŽåïŒãé ç¹ããšã«å埩åŠçãããèŠèŠçãªã¢ãŒãã£ãã¡ã¯ããäžæ£ãªã¬ã³ããªã³ã°ã«ã€ãªãããŸãããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ããšã®å±æ§ã®é€æ°ã1ã«èšå®ãããŠããããšãå確èªããŠãã ããã -
è¡åã®å±æ§ãã±ãŒã·ã§ã³ã®äžäžèŽïŒ
mat4ã¯é£ç¶ãã4ã€ã®å±æ§ãã±ãŒã·ã§ã³ãå¿ èŠãšããŸããã·ã§ãŒããŒã®è¡åã«å¯Ÿããlayout(location = X)ããmatrixLocationãmatrixLocation + 1ã+2ã+3ã«å¯ŸããŠgl.vertexAttribPointerã³ãŒã«ãã©ã®ããã«èšå®ããŠããããšäžèŽããŠããããšã確èªããŠãã ããã -
ããŒã¿åæã®åé¡ïŒåçã€ã³ã¹ã¿ã³ã·ã³ã°ïŒïŒ ã€ã³ã¹ã¿ã³ã¹ãæ£ããæŽæ°ãããªãããŸãã¯ããžã£ã³ããããŠããããã«èŠããå ŽåãCPUåŽã®ããŒã¿ã倿Žããããã³ã«ã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ãGPUã«åã¢ããããŒãïŒ
gl.bufferDataãŸãã¯gl.bufferSubDataïŒããŠããããšã確èªããŠãã ããããŸããæŽæ°åã«ãããã¡ããã€ã³ããããŠããããšã確èªããŠãã ããã -
gl_InstanceIDã«é¢é£ããã·ã§ãŒããŒã³ã³ãã€ã«ãšã©ãŒïŒgl_InstanceIDã䜿çšããŠããå Žåãã·ã§ãŒããŒã#version 300 esïŒWebGL 2.0çšïŒã§ããããšããŸãã¯ANGLE_instanced_arraysæ¡åŒµæ©èœãæ£ããæå¹ã«ããWebGL 1.0ã§ã€ã³ã¹ã¿ã³ã¹IDã屿§ãšããŠæåã§æž¡ããŠããå¯èœæ§ãããããšã確èªããŠãã ããã - æåŸ éãã®ããã©ãŒãã³ã¹åäžãèŠãããªãïŒ ãã¬ãŒã ã¬ãŒããå€§å¹ ã«å¢å ããªãå Žåãã€ã³ã¹ã¿ã³ã·ã³ã°ãäž»èŠãªããã«ããã¯ã«å¯ŸåŠããŠããªãå¯èœæ§ããããŸãããããã¡ã€ãªã³ã°ããŒã«ïŒãã©ãŠã¶éçºè ããŒã«ã®ããã©ãŒãã³ã¹ã¿ããå°çšã®GPUãããã¡ã€ã©ãªã©ïŒã¯ãã¢ããªã±ãŒã·ã§ã³ãäŸç¶ãšããŠCPUããŠã³ãã§ãããïŒäŸãã°ãéå°ãªç©çèšç®ãJavaScriptããžãã¯ãè€éãªã«ãªã³ã°ã®ããïŒããŸãã¯å¥ã®GPUããã«ããã¯ïŒäŸãã°ãè€éãªã·ã§ãŒããŒãå€ãããããªãŽã³ããã¯ã¹ãã£åž¯åå¹ ïŒãåå ã§ããããç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- 巚倧ãªã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯å¹ççã§ãããéåžžã«å€§ããªã€ã³ã¹ã¿ã³ã¹ããŒã¿ãããã¡ïŒäŸãã°ãè€éãªã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ãæã€æ°çŸäžã®ã€ã³ã¹ã¿ã³ã¹ïŒã¯ãäŸç¶ãšããŠããªãã®GPUã¡ã¢ãªãšåž¯åå¹ ãæ¶è²»ããããŒã¿ã¢ããããŒãäžãŸãã¯ãã§ããäžã«ããã«ããã¯ã«ãªãå¯èœæ§ããããŸããã«ãªã³ã°ãLODããŸãã¯ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã®ãµã€ãºãæé©åããããšãæ€èšããŠãã ããã
- ã¬ã³ããªã³ã°é åºãšéæåºŠïŒ éæãªã€ã³ã¹ã¿ã³ã¹ã®å Žåãã¬ã³ããªã³ã°é åºãè€éã«ãªãããšããããŸãããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãåäžã®æç»ã³ãŒã«ã§æç»ããããããéæåºŠã®ããã®å žåçãªå¥¥ããæåãžã®ã¬ã³ããªã³ã°ã¯ãã€ã³ã¹ã¿ã³ã¹ããšã«çŽæ¥è¡ãããšã¯ã§ããŸããã解決çãšããŠã¯ãCPUã§ã€ã³ã¹ã¿ã³ã¹ããœãŒãããŠãããœãŒããããã€ã³ã¹ã¿ã³ã¹ããŒã¿ãåã¢ããããŒãããããé åºéäŸåã®éæåºŠæè¡ã䜿çšããããšãæããããŸãã
ç¹ã«å±æ§ã®èšå®ã«é¢ããŠãæ³šææ·±ããããã°ãšçްéšãžã®æ³šæããã€ã³ã¹ã¿ã³ã·ã³ã°å®è£ ãæåãããéµãšãªããŸãã
å®äžçã®å¿çšãšã°ããŒãã«ãªåœ±é¿
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®å®çšçãªå¿çšã¯åºç¯ã§ãããç¶ç¶çã«æ¡å€§ããŠãããæ§ã ãªã»ã¯ã¿ãŒã§ã€ãããŒã·ã§ã³ãæšé²ããäžçäžã®ãŠãŒã¶ãŒã®ããžã¿ã«äœéšãè±ãã«ããŠããŸãã
-
ã²ãŒã éçºïŒ ããã¯ããããæãé¡èãªå¿çšäŸã§ããã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ä»¥äžã®ã¬ã³ããªã³ã°ã«äžå¯æ¬ ã§ãïŒ
- åºå€§ãªç°å¢ïŒ äœåãã®æšã ãèã¿ãããæ£®ãç¡æ°ã®å»ºç©ãç«ã¡äžŠã¶åºå€§ãªéœåžããŸãã¯å€æ§ãªå²©ç³å±€ãæã€ãªãŒãã³ã¯ãŒã«ãã®é¢šæ¯ã
- 矀è¡ãšè»éïŒ ãããããäœçœ®ãåããè²ã«åŸ®åŠãªããªãšãŒã·ã§ã³ãæã€å€æ°ã®ãã£ã©ã¯ã¿ãŒã§ã·ãŒã³ãæºãããä»®æ³äžçã«çåœãå¹ã蟌ãã
- ããŒãã£ã¯ã«ã·ã¹ãã ïŒ ç ãç«ãéšããŸãã¯éæ³ã®ãšãã§ã¯ãã®ããã®äœçŸäžãã®ããŒãã£ã¯ã«ãããã¹ãŠå¹ççã«ã¬ã³ããªã³ã°ããã
-
ããŒã¿å¯èŠåïŒ å€§èŠæš¡ãªããŒã¿ã»ããã衚çŸããããã«ãã€ã³ã¹ã¿ã³ã·ã³ã°ã¯åŒ·åãªããŒã«ãæäŸããŸãïŒ
- æ£åžå³ïŒ äœçŸäžãã®ããŒã¿ãã€ã³ãïŒäŸãã°ãå°ããªçäœãç«æ¹äœãšããŠïŒãå¯èŠåããåãã€ã³ãã®äœçœ®ãè²ããµã€ãºãç°ãªãããŒã¿æ¬¡å ã衚ãããšãã§ããŸãã
- ååæ§é ïŒ äœçŸãäœåãã®ååãšçµåãæã€è€éãªååãã¬ã³ããªã³ã°ãããããããçäœãåæ±ã®ã€ã³ã¹ã¿ã³ã¹ã§ããã
- å°ç空éããŒã¿ïŒ åºå€§ãªå°ççå°åã«ãããéœåžã人å£ããŸãã¯ç°å¢ããŒã¿ã衚瀺ããåããŒã¿ãã€ã³ããã€ã³ã¹ã¿ã³ã¹åãããèŠèŠçãªããŒã«ãŒãšãªãã
-
建ç¯ããã³ãšã³ãžãã¢ãªã³ã°ã®å¯èŠåïŒ
- å€§èŠæš¡æ§é ç©ïŒ 倧ããªå»ºç©ãå·¥æ¥ãã©ã³ãã«ãããæ¢ãæ±ãçªããŸãã¯è€éãªãã¡ãµãŒããã¿ãŒã³ãªã©ã®ç¹°ãè¿ãããæ§é èŠçŽ ãå¹ççã«ã¬ã³ããªã³ã°ããã
- éœåžèšç»ïŒ 建ç¯ã¢ãã«ã«ãã¬ãŒã¹ãã«ããŒã®æšãè¡ç¯ãè»äž¡ãé 眮ããŠãã¹ã±ãŒã«æãšç°å¢ã®æèŠãäžããã
-
ã€ã³ã¿ã©ã¯ãã£ããªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒïŒ èªåè»ãå®¶å
·ããã¡ãã·ã§ã³ãªã©ã®æ¥çã§ã顧客ã3Dã§è£œåãã«ã¹ã¿ãã€ãºããå ŽåïŒ
- ã³ã³ããŒãã³ãã®ããªãšãŒã·ã§ã³ïŒ 補åäžã®å€æ°ã®åäžã³ã³ããŒãã³ãïŒãã«ãããªããããå埩ãã¿ãŒã³ãªã©ïŒã衚瀺ããã
- 倧éçç£ã·ãã¥ã¬ãŒã·ã§ã³ïŒ 補åã倧éçç£ãããå Žåã«ã©ã®ããã«èŠããããå¯èŠåããã
-
ã·ãã¥ã¬ãŒã·ã§ã³ãšç§åŠèšç®ïŒ
- ãšãŒãžã§ã³ãããŒã¹ã¢ãã«ïŒ åãšãŒãžã§ã³ããã€ã³ã¹ã¿ã³ã¹åãããèŠèŠè¡šçŸã§ããã倿°ã®åå¥ãšãŒãžã§ã³ãïŒé³¥ã®çŸ€ããäº€éæµã矀è¡ã®ãã€ããã¯ã¹ãªã©ïŒã®æ¯ãèããã·ãã¥ã¬ãŒãããã
- æµäœååŠïŒ ããŒãã£ã¯ã«ããŒã¹ã®æµäœã·ãã¥ã¬ãŒã·ã§ã³ãå¯èŠåããã
ãããã®åé åã«ãããŠãWebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ããªããã§ã€ã³ã¿ã©ã¯ãã£ãããã€é«æ§èœãªWebäœéšãåµé ããããã®å€§ããªéå£ãåãé€ããŸãã倿§ãªããŒããŠã§ã¢ã«ããã£ãŠé«åºŠãª3Dã¬ã³ããªã³ã°ãã¢ã¯ã»ã¹å¯èœãã€å¹ççã«ããããšã§ã匷åãªå¯èŠåããŒã«ãæ°äž»åããã°ããŒãã«ãªã¹ã±ãŒã«ã§ã®ã€ãããŒã·ã§ã³ãä¿é²ããŸãã
çµè«
WebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãWebäžã§ã®å¹ççãª3Dã¬ã³ããªã³ã°ã®åºç€ãšãªããã¯ããã¯ã§ããããã¯ãé·å¹Žã®èª²é¡ã§ãã£ã倿°ã®è€è£œãªããžã§ã¯ããæé©ãªããã©ãŒãã³ã¹ã§ã¬ã³ããªã³ã°ããåé¡ã«çŽæ¥åãçµã¿ããã€ãŠã¯ããã«ããã¯ã§ãã£ããã®ã匷åãªèœåãžãšå€è²ãããŸããGPUã®äžŠååŠçèœåãæŽ»çšããCPU-GPUéã®éä¿¡ãæå°éã«æããããšã§ãã€ã³ã¹ã¿ã³ã·ã³ã°ã¯éçºè ãä¿¡ããããªãã»ã©è©³çްã§ãåºå€§ã§ããã€ãããã¯ãªã·ãŒã³ãäœæãããã¹ã¯ãããããæºåž¯é»è©±ãŸã§ãå¹ åºãããã€ã¹ã§ã¹ã ãŒãºã«å®è¡ã§ããããã«ããŸããããã«ãããçã«ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«å¯Ÿå¿ããããšãã§ããŸãã
åºå€§ãªã²ãŒã ã¯ãŒã«ãã®æ§ç¯ãå€§èŠæš¡ãªããŒã¿ã»ããã®å¯èŠåãããè€éãªå»ºç¯ã¢ãã«ã®èšèšããªãããªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒã®å®çŸãŸã§ããžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ã®å¿çšã¯å€æ§ãã€åœ±é¿åããããŸãããã®ãã¯ããã¯ãåãå ¥ããããšã¯åãªãæé©åã§ã¯ãªããæ°äžä»£ã®æ²¡å ¥åã§é«æ§èœãªWebäœéšãå¯èœã«ãããã®ã§ãã
ãšã³ã¿ãŒãã€ã¡ã³ããæè²ãç§åŠã忥ã®ãããã®åéã§éçºããŠããå Žåã§ããWebGLãžãªã¡ããªã€ã³ã¹ã¿ã³ã·ã³ã°ãç¿åŸããããšã¯ãããªãã®ããŒã«ãããã«ãããŠéåžžã«è²Žéãªè³ç£ãšãªãã§ããããããã§è°è«ããæŠå¿µãšã³ãŒãäŸã詊ãããèªèº«ã®ãããžã§ã¯ãã«çµ±åããããšããå§ãããŸããé«åºŠãªWebã°ã©ãã£ãã¯ã¹ãžã®æ ã¯ããããã®ãããã®ã§ãããã€ã³ã¹ã¿ã³ã·ã³ã°ã®ãããªãã¯ããã¯ã䜿ãã°ããã©ãŠã¶ã§çŽæ¥éæã§ããããšã®å¯èœæ§ã¯æ¡å€§ãç¶ããäžçäžã®ãã¹ãŠã®äººã ã®ããã®ã€ã³ã¿ã©ã¯ãã£ããªããžã¿ã«ã³ã³ãã³ãã®å¢çãæŒãåºããŸãã